package org.softeg.slartus.forpdaplus.controls.imageview; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.drawable.Drawable; import android.widget.ImageView; import com.nineoldandroids.animation.ObjectAnimator; import com.nineoldandroids.animation.ValueAnimator; public class MaterialImageLoading { private static final int DEFAULT_DURATION = 3000; public static MaterialImageLoading animate(ImageView imageView) { MaterialImageLoading materialImageLoading = new MaterialImageLoading(imageView); return materialImageLoading; } private MaterialImageLoading(ImageView imageView) { this.imageView = imageView; this.drawable = imageView.getDrawable(); } final ImageView imageView; final Drawable drawable; int duration = DEFAULT_DURATION; float saturation; public int getDuration() { return duration; } public MaterialImageLoading setDuration(int duration) { this.duration = duration; return this; } private ColorMatrix setContrast(float contrast) { float scale = contrast + 1.f; float translate = (-.5f * scale + .5f) * 255.f; float[] array = new float[]{ scale, 0, 0, 0, translate, 0, scale, 0, 0, translate, 0, 0, scale, 0, translate, 0, 0, 0, 1, 0}; ColorMatrix matrix = new ColorMatrix(array); return matrix; } ValueAnimator animationSaturation; ValueAnimator animationContrast; ObjectAnimator animationAlpha; private void setup(int duration) { //region saturation animationSaturation = ValueAnimator.ofFloat(0.2f, 1f); animationSaturation.setDuration(duration); animationSaturation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { saturation = animation.getAnimatedFraction(); } }); //endregion //region contrast animationContrast = ValueAnimator.ofFloat(0, 1f); animationContrast.setDuration(duration * 3 / 4); animationContrast.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { ColorMatrix colorMatrix = setContrast(animation.getAnimatedFraction()); colorMatrix.setSaturation(saturation); ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix); drawable.setColorFilter(colorFilter); } }); //endregion //region alpha animationAlpha = ObjectAnimator.ofFloat(imageView, "alpha", 0f, 1f); animationAlpha.setDuration(duration / 2); //endregion } public void start() { setup(duration); animationSaturation.start(); animationContrast.start(); animationAlpha.start(); } public void cancel(){ animationSaturation.cancel(); animationContrast.cancel(); animationAlpha.cancel(); } }